﻿//桥接模式
//桥接模式是一众结构型设计模式，可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构，从而能在开发时分别使用。

//假如你有一个几何“形状（Shape）”类，能从他扩扩展出两个子类：“圆形（Circle）”和“方形（Square）”。你希望对这样的类层次结构进行扩展使其包含颜色，所以你打算创建
//名为“红色（red）”和“蓝色（blue）”的形状子类。但是，由于你已有两个子类，所以总共需要创建四个类才能覆盖所有组合，例如“蓝色圆形（BlueCircle）”和“红色方形（RedSquare）”
//在层次结构中新增形状和颜色将导致代码复杂程度指数级增长。例如添加三角形状，你需要新增两个子类，也就是每种颜色一个，此后每新增一种颜色都需要新增三个子类，即每种形状一个，如此以往，情况会越来越糟糕。
//解决方案：问题的根本原因是我们试图在两个独立的维度--形状与颜色--上扩展形状类。这在处理类的继承时是很常见的问题。
//桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说， 就是抽取其中一个维度并使之成为独立的类层次， 这样就可以在初始类中引用这个新层次的对象， 从而使得一个类不必拥有所有的状态和行为。
//根据该方法，我们可以将颜色相关代码抽取到拥有“红色”和“蓝色”两个子类的颜色类中，然后在“形状”类中添加一个指向某一颜色对象的引用成员变量。现在，形状类可以将所有与颜色相关的工作委派给连入
//的颜色对象。这样引用就成为“形状”和“颜色”之间的桥梁。此后，新增颜色将不需要修改形状的类层次，反之亦然。
//抽象部分：与业务联系紧密的应视为抽象部分，抽象自身不完成任何具体的工作，他需要将工作委派给具体的实现部分
//实现布冯：具体的业务实现

//TV
TV tV = new TV();
//电脑
computer computer = new();

controller controller;

//y有限控制器
controller = new Wirelesscontroller(tV);
//有限控制器设置tv音量
Console.WriteLine(controller.SetTVvoice(10));
//显示有限控制器剩余点亮
Console.WriteLine(controller.power);
//显示tv剩余点亮
Console.WriteLine(tV.ShowPower());

//假设我们的业务是以控制器来控制设备，那么我们的控制器分为无线控制器和有限控制器，可能的设备有电视，电脑，音频
//因为我们是用控制器控制设备，那么我们认为控制器和业务联系紧密，因此控制器部分是抽象部分
//抽象部分
public abstract class controller
{
    public controller()
    { }

    //控制器剩余电量
    public int power { get; set; } = 10;

    protected TV tv;

    public controller(TV tv)
    {
        this.tv = tv;
    }

    protected computer computer;

    public controller(computer computer)
    {
        this.computer = computer;
    }

    //调节返回电视音量
    public int SetTVvoice(int num)
    {
        this.power -= 1;
        return this.tv.SetVocie(num);
    }

    //控制返回电脑开机状态
    public bool SetComputerIsOpent(bool isopen)
    {
        this.power -= 1;
        return this.computer.SetOpen(isopen);
    }
}

//无线控制器
public class Wirelesscontroller : controller
{
    public Wirelesscontroller(TV tV) : base(tV)
    {
    }

    public Wirelesscontroller(computer tV) : base(tV)
    {
    }
}

//有线控制器Wiredcontroller
public class Wiredcontroller : controller
{
    public Wiredcontroller(TV tV) : base(tV)
    {
    }

    public Wiredcontroller(computer tV) : base(tV)
    {
    }
}

//实现部分
//设备
public abstract class equipment
{
    //设备剩余点亮
    public int power { get; set; } = 10;

    //显示设备剩余点亮
    public int ShowPower()
    {
        return power;
    }
}

//TV
public class TV : equipment
{
    //电视音量
    public int voice { get; set; }

    //调节并返回音量
    public int SetVocie(int num)
    {
        //消耗1电量
        this.power -= 1;
        return voice + num;
    }
}

//computer
public class computer : equipment
{
    //电脑是否开机
    public bool isopen { get; set; } = false;

    //开机返回当前电脑开机状态
    public bool SetOpen(bool num)
    {
        //开机电量-1
        this.power -= 1;
        return isopen = num;
    }
}